/**
 * SSR增强的导出服务
 * 扩展现有ExportService，提供基于Vue SSR的组件导出功能
 */

import { ExportService } from './ExportService';
import ssrExportService from './SSRExportService';

export class SSREnhancedExportService extends ExportService {
  constructor() {
    super();
    this.ssrExportService = ssrExportService;
    this.ssrEnabled = true; // 默认启用SSR
  }

  /**
   * 设置是否启用SSR导出
   * @param {boolean} enabled 是否启用
   */
  setSSREnabled(enabled) {
    this.ssrEnabled = !!enabled;
  }

  /**
   * 处理单个组件导出，优先使用SSR渲染
   * @override
   * @param {Object} component 组件数据
   * @param {Object} options 导出选项
   * @returns {Promise<Object>} 导出结果
   */
  async exportComponent(component, options = {}) {
    try {
      // 如果启用了SSR，且不是SSR排除的组件类型，则尝试SSR渲染
      if (this.ssrEnabled && !this.isSSRExcluded(component.type)) {
        try {
          // 使用SSR渲染组件
          const html = await this.ssrExportService.renderComponentToHTML(component);
          
          if (html) {
            const js = await this.ssrExportService.generateComponentJS(component);
            const css = await this.ssrExportService.generateComponentCSS(component);
            const resources = await this.ssrExportService.getComponentResources(component);
            
            // 如果有自定义CSS，添加到资源中
            if (css) {
              const styleId = `${component.id}-styles`;
              const inlineStyle = `<style id="${styleId}">\n${css}\n</style>`;
              
              // 在HTML的结束标签前插入样式
              const enhancedHTML = html.replace(/<\/(\w+)>$/, `${inlineStyle}\n</$1>`);
              
              return {
                html: enhancedHTML,
                js,
                resources
              };
            }
            
            return {
              html,
              js,
              resources
            };
          }
        } catch (ssrError) {
          console.warn(`[SSREnhancedExport] SSR渲染组件失败，回退到传统方式: ${component.type}`, ssrError);
          // 失败时回退到父类的传统方式
        }
      }
      
      // 回退到父类的传统导出方法
      return await super.exportComponent(component, options);
    } catch (error) {
      console.error(`[SSREnhancedExport] 导出处理错误 (${component.type}):`, error);
      return super.defaultExporter(component, options);
    }
  }

  /**
   * 检查组件类型是否排除使用SSR
   * @param {string} componentType 组件类型
   * @returns {boolean} 是否排除
   */
  isSSRExcluded(componentType) {
    // 这里可以定义不适合SSR的组件类型列表
    const excludedTypes = [
      // 复杂交互型组件可能不适合SSR
      'chart',
      'video-player',
      'audio-player',
      // 其他排除的组件...
    ];
    
    return excludedTypes.includes(componentType);
  }

  /**
   * 初始化SSR导出服务
   * @returns {Promise<void>}
   */
  async initializeSSR() {
    await this.ssrExportService.initialize();
  }
}

// 创建SSR增强的导出服务单例
const ssrEnhancedExportService = new SSREnhancedExportService();

// 初始化SSR导出服务
ssrEnhancedExportService.initializeSSR().catch(error => {
  console.error('[SSREnhancedExport] 初始化SSR失败，将回退到传统导出方式:', error);
  ssrEnhancedExportService.setSSREnabled(false);
});

export default ssrEnhancedExportService; 